const express = require('express');
const app = express();
const {APP_PORT} = require('./config/configDefault');
const joi = require('joi');

/**
 * 配置并启用CORS（跨域资源共享）中间件。
 * 该参数必须是一个有效的Express应用对象。
 * 允许跨域请求。
 */ 
const cor = require('cors');

//全局挂载
app.use(cor());
const multer = require('multer');
/**
 * 配置文件上传中间件，使用multer库创建一个上传配置实例，用于处理HTTP文件上传请求，该配置将上传的文件存储到指定的目录中
 */
const upload = multer({
	dest: './public/upload'
})
app.use(upload.any())
//静态托管
app.use(express.static("./public"));

/**
 * 配置 Express 应用以使用 body-parser 中间件解析 URL 编码的请求体。
 * 重要参数说明：
 * - `bodyParser.urlencoded` 是一个中间件函数，用于解析 URL 编码格式的请求体。
 *   - `extended: false` 表示使用 querystring 库解析请求体，仅支持简单数据类型（如字符串和数组）。
 *     如果设置为 `true`，则会使用 qs 库，支持更复杂的数据结构（如嵌套对象）。
 * 返回值：无。该代码的作用是为 Express 应用添加中间件，不直接返回值。
 */
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: false }));

//使用 body-parser 中间件来解析请求体中的 JSON 数据。
//该中间件没有返回值，它的作用是修改请求对象 (req)，以便在后续处理中可以访问解析后的 JSON 数据。
app.use(bodyParser.json());

const jwtconfig = require('./jwt_config/index.js');
const {expressjwt:jwt} = require('express-jwt');
//使用中间件排除不需要在请求端发送token的接口
// app.use(jwt({
//   secret: jwtconfig.jwtSecreKey,
//   algorithms: ['HS256'],
// }).unless({
//   //正则表达式排除/api前缀
//   path: [/^\/api\//]
// }));

// 错误中间件 status=1 失败 status=0 成功
app.use((req,res,next)=>{
  res.cc = (err,status=1) => {
    res.send({
      status,
      //判断是否是Error对象，如果是Error对象则返回message属性，否则返回err
      message: err instanceof Error ? err.message : err,
    })
  }
  next();
})


//引入登录注册模块路由
const loginRouter = require('./router/login');
app.use('/api', loginRouter);
// 引入用户信息路由模块
const userRouter = require('./router/userinfo.js')
app.use('/user', userRouter)


//错误中间件，对不符和JOI验证规则的值报错
app.use((err,req,res,next)=>{
  if(err instanceof joi.ValidationError){
    return res.cc(err)
  }
  next();
})


/**
 * 启动服务器并监听指定端口。
 * 说明：此函数通过调用 `app.listen` 方法启动服务器，并在服务器成功启动后，
 */
app.listen(APP_PORT, () => {
  // 当服务器成功启动时，输出服务器运行地址到控制台
  console.log(`Api服务已启动于 http://localhost:${APP_PORT}`);
});